package com.augurit.gzcgwsp.excelimportexport.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.FileChannel;
import java.util.Properties;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.augurit.common.base.form.Attachment;

/**
 * <P>title:</p>																								
 * <P>Description：</p>
 * <p>Copyright: Copyright (c) 2011 augurit</p>
 * <p>Company: 广州奥格智能科技</p>
 * History：
 * @author:zhangjun
 * @date Nov 8, 2011
 * @version 1.0
 */
/**
 * @author Administrator
 *
 */
public class FileUtil {
    private static final Logger logger=Logger.getLogger(FileUtil.class);
    public final static String separator = File.separator; 
    private static Properties sysProps = new Properties();
	
	protected static final int BUFFER_SIZE = 2048;

	/**
	 * 上传文件并返回文件路径
	 * @param path 服务器所在路径 如：F:\project\cmdsp\WebRoot\
	 * @param realpath 上传的文件夹 如 :uploadfiles\25562791553926pic.doc
	 * @param file 上传的文件
	 * @param filename 文件名称
	 * @return
	 */
	@SuppressWarnings("unused")
	public static String uploadFile(String path,String realpath,File file){
		
		 FileInputStream fis=null;
		 FileOutputStream fos=null;
		  try{
			fis = new FileInputStream(file);
			if(StringUtils.isNotBlank(path)){
				String paths=path+realpath;
				String dirPaths=paths.substring(0,paths.lastIndexOf(File.separator));
				createDir(dirPaths);
				fos = new FileOutputStream(path+realpath);
			}
			else{
				createDir(realpath);
				fos = new FileOutputStream(realpath);
			}
			byte[] buffer = new byte[BUFFER_SIZE];
			int len = 0;
			while((len=fis.read(buffer))>0){
				fos.write(buffer,0,len);
			}
		  }catch(Exception e){
			  e.printStackTrace();
		  }finally{
			  try {
				fis.close();
				fos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		  }
		  
		 return realpath;
	}
	
	
    public static void copyDir(String srcDir, String targDir) throws IOException {
        File targFile = new File(targDir);
        //判断目标文件夹是否存在，否则创建
        if(!targFile.exists()){
            if(!targFile.mkdirs()){
                logger.error("创建文件目录失败: " + targDir + "!!!"); 
            }
        }
 
        File file = new File(srcDir);
        File files[] = file.listFiles();
        //循环复制文件夹和文件
        for (int i = 0; i < files.length; i++) {
            if(files[i].isDirectory()){
                if(!createDir(targDir + File.separator + files[i].getName()))
                   logger.info("创建文件目录错误:"+targDir + files[i].getName());
                   copyDir(srcDir + separator + files[i].getName(), targDir + separator + files[i].getName());
            }else{
                   copyFile(srcDir + separator + files[i].getName(), targDir + separator + files[i].getName());
            }
        }
        //这个就是remove掉源文件，加上这个的话那方法名就要改成removeDir（）了，赫赫
        delDir(srcDir);
    }

    /**
     * 获取配置文件的信息
     * @param properties 配置文件
     * @param name
     * @return
     */
    public  String getValue(String propFile,String name){
        String filename="";
        InputStream is = this.getClass().
        getClassLoader().getResourceAsStream(propFile);  
        try {
            sysProps.load(is);
            is.close();
        } catch (Exception e) {
           logger.error("不能读取系统参数文件"+propFile+"在CLASSPATH指定的路径中");
        }
        try{
            filename = sysProps.get(name).toString().trim();
        }catch(Exception e){
            logger.error("读取系统参数文件"+propFile+"错误");
        }
            return filename;
    }
    //创建一个文件夹
    public static boolean createDir(String fileDir) throws FileNotFoundException{
    	File file = new File(fileDir);
       if(!file.exists()){
            if(!file.mkdirs()){
                 throw new FileNotFoundException("创建文件夹不存在: " + fileDir + "!!!"); 
            }
       }
       return true;
    }
    //利用nio 中的FileChannel复制文件
    public static void copyFile(String srcFile, String targFile) throws IOException {
    	String dir=targFile.substring(0,targFile.lastIndexOf(File.separator));
    	
    	if(!new File(dir).exists()){
    		new File(dir).mkdirs();
    	}
       FileInputStream fis = new FileInputStream(srcFile);
       FileOutputStream fos = new FileOutputStream(targFile);
 
       FileChannel fcin = fis.getChannel();
       FileChannel fcout = fos.getChannel();

       fcin.transferTo(0, fcin.size(), fcout);

       fcin.close();
       fcout.close();
       fis.close();
       fos.close();
    }
    
    public static void main(String [] args) throws IOException{
    	
    	FileUtil.copyFile("E:\\cgwsp\\gzcgwsp\\gzcgwsp\\WebApp\\Templates\\exportRqStateData.xls", "E:\\20124\\20124111172247.xls");
    }
    //删除一个目录及其目录下的所有文件
    public static void delDir(String srcDir) throws IOException{
       File file = new File(srcDir);
       if(!file.exists())
        return;
 
       File files[] = file.listFiles();
       for (int i = 0; i < files.length; i++) {
            if(files[i].isDirectory())
                 delDir(srcDir + separator + files[i].getName());
                delFile(srcDir + separator + files[i].getName());
        }
        delFile(srcDir);
    }
    /**
     * 删除文件夹下某个文件之外的所有文件
     * @param srcDir
     * @param filename
     * @throws IOException
     */
    public static void delDir(String srcDir,String filename) throws IOException{
        File file = new File(srcDir);
        if(!file.exists())
         return;
  
        File files[] = file.listFiles();
        for (int i = 0; i < files.length; i++) {
             if(!files[i].isDirectory()){
            	 String name=files[i].getName();
            	 if(!files[i].getName().equals(filename)){
                     delFile(srcDir + separator + files[i].getName());
            	 }
             }
         }
         
     }
    //删除一个文件
    public static boolean delFile(String srcFile) throws IOException {
       File file = new File(srcFile);
       if(!file.delete())
            throw new IOException("文件删除出现错误:" + srcFile);
       return true;
    }
    
    
    /**
	 * 将附件上传至服务器磁盘的指定路径下
	 * @param filePath 附件上传的服务器磁盘路径
	 * @param attachment 页面上传的附件对象
	 * @param autoBuildDir true表示当文件路径不存在时自动创建
	 * @param canCover true表示当指定文件已经存在时可覆盖原有文件
	 * @return true表示上传成功，false表示上传失败
	 */
	public static boolean uploadFile(String filePath,Attachment attachment,boolean autoBuildDir,boolean canCover) {
		boolean result = false;
		InputStream in = null;
		OutputStream ou = null;
		try {
			// 文件路径格式处理
		    filePath = filePath.replace("/",File.separator);
			// 上传附件文件夹路径
		    String directoryPath = filePath.substring(0,filePath.lastIndexOf(File.separator));
			// 完整上传路径
			// 如果文件目录不存在则创建
			if(autoBuildDir){
				File dir = new File(directoryPath);
				if(!dir.exists())
					dir.mkdirs();
			}

			// 输出附件
			File outputFile = new File(filePath);
			//如果文件不存在则可上传，如果文件存在并且设置为可覆盖则也可上传
			boolean isFileExist = outputFile.exists();
			if(!isFileExist || (isFileExist && canCover)){
					
				boolean canUpload = true; //标识是否能够上传文件
				
				//如果文件存在要先删除，如果文件不存在则标识为可上传
				if(isFileExist)
					canUpload = outputFile.delete();
				
				if(canUpload){
					// 保存附件至服务器
					in = new BufferedInputStream(new FileInputStream(attachment.getFile()), BUFFER_SIZE);
					ou = new BufferedOutputStream(new FileOutputStream(outputFile), BUFFER_SIZE);
					byte[] buffer = new byte[BUFFER_SIZE];
					while (in.read(buffer) > 0) {
						ou.write(buffer);
					}
					
					result = true;		//上传附件成功
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(in != null) {
					in.close();
				}
				if(ou != null) {
					ou.close();
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		return result;
	}
	

 
}


